package com.dragon.modules.yuegou.web;

import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.annotation.Nullable;
import javax.servlet.http.HttpServletRequest;

/**
 * 数据切片工具类
 * 
 * @author liuwu
 *
 */
public class DataSliceUtils {

	/**
	 * 数据切片ID统一请求头
	 */
	public static final String DATA_SLICE_HEADER_NAME = "X-DATA-ID";

	/**
	 * 大运营平台数据ID<br>
	 * 大运营平台切换商圈，表示查看对应商圈的数据，但是大运营平台本身就有数据，需要有一个数据ID来代表大运营平台的数据。
	 * 与到此ID则不走数据权限体系，业务逻辑在大运营平台范围内的数据处理
	 */
	public static final String PLATFORM_DATA_ID = "P";

	/**
	 * 获取当前数据切片ID<br>
	 * 请注意，只能在HTTP请求线程使用，在后台线程中调用这个方法将会返回null
	 * 
	 * @return 当前请求携带的数据切片ID
	 */
	@Nullable
	public static String currentDataSliceId() {
		try {
			HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
			String dataId = request.getHeader(DATA_SLICE_HEADER_NAME);
			if (StringUtils.isEmpty(dataId)) {
				return null;
			} else {
				return dataId;
			}
		} catch (IllegalStateException e) {
			return null;
		}
	}

	/**
	 * 获取当前商圈ID<br>
	 * 请注意，只能在HTTP请求线程使用，在后台线程中调用这个方法将会返回null
	 * 
	 * @return 当前商圈ID
	 */
	@Nullable
	public static String currentBusdId() {
		String dataId = currentDataSliceId();
		if (dataId == null) {
			return null;
		}
		if (dataId.startsWith("D")) {
			int sp = dataId.indexOf("G");
			if (sp < 0) {
				throw new IllegalStateException("数据单元ID不符合范式：D+商圈ID+G+集团ID");
			}
			return dataId.substring(1, sp);
		} else if (dataId.startsWith("G")) {
			throw new IllegalArgumentException("X-DATA-ID目前不支持集团ID");
		} else if(PLATFORM_DATA_ID.equals(dataId)){
			return null;
		} else {
			throw new IllegalArgumentException("非法X-DATA-ID：" + dataId);
		}
	}

	public static String currentBusdId(String dataId) {
		if (dataId == null) {
			return null;
		}
		if (dataId.startsWith("D")) {
			int sp = dataId.indexOf("G");
			if (sp < 0) {
				return null;
			}
			return dataId.substring(1, sp);
		} else if (dataId.startsWith("G")) {
			return null;
		} else if(PLATFORM_DATA_ID.equals(dataId)){
			return null;
		} else {
			return null;
		}
	}
	
	/**
	 * 获取当前集团ID<br>
	 * 请注意，只能在HTTP请求线程使用，在后台线程中调用这个方法将会返回null
	 * 
	 * @return 当前集团ID
	 */
	@Nullable
	public static String currentGroupId() {
		String dataId = currentDataSliceId();
		if (dataId == null) {
			return null;
		}
		if (dataId.startsWith("D")) {
			int sp = dataId.indexOf("G");
			if (sp < 0) {
				throw new IllegalStateException("数据单元ID不符合范式：D+商圈ID+G+集团ID");
			}
			return dataId.substring(sp+1);
		} else if (dataId.startsWith("G")) {
			throw new IllegalArgumentException("X-DATA-ID目前不支持集团ID");
		} else if(PLATFORM_DATA_ID.equals(dataId)){
			return null;
		} else {
			throw new IllegalArgumentException("非法X-DATA-ID：" + dataId);
		}
	}

	/**
	 * 判断是否是大运营平台数据切片
	 * 
	 * @return true表示是大运营平台数据切片，相关业务逻辑只能在大运营平台的数据切片下执行；false表示不是大运营平台数据切片
	 */
	public static boolean isPlatform() {
		return PLATFORM_DATA_ID.equals(currentDataSliceId());
	}
}
